﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 目标标本：4.0.30319.239
 * 
 * 最后修改：2011/11/1 21:51:55
 * ************************************************************/
namespace Mozlite.Common
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;

    /// <summary>
    /// 积分钱币类。
    /// </summary>
    public class Currency
    {
        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Common.Currency"/>。
        /// </summary>
        public Currency() { }

        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Common.Currency"/>。
        /// </summary>
        /// <param name="reader">数据库读取器实例对象，<see cref="T:System.Data.IDataReader"/>。</param>
        public Currency(IDataReader reader)
        {
            SettingsID = reader.GetInt32("SettingsID");
            Key = reader.GetString("Key");
            CurrencyID = reader.GetInt32("CurrencyID");
            IsMoney = reader.GetBoolean("IsMoney");
            Name = reader.GetString("Name");
            Unit = reader.GetString("Unit");
            Enabled = reader.GetBoolean("Enabled");
            MinValue = reader.GetInt32("MinValue");
            MaxValue = reader.GetInt32("MaxValue");
            DefaultValue = reader.GetInt32("DefaultValue");
        }
        /// <summary>
        /// 网站设置ID。
        /// </summary>
        public int SettingsID { get; set; }
        /// <summary>
        /// 钱币ID。
        /// </summary>
        public int CurrencyID { get; set; }
        /// <summary>
        /// 判断是否为金钱。
        /// </summary>
        public bool IsMoney { get; set; }
        /// <summary>
        /// 名称。
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 单位。
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// 是否启用。
        /// </summary>
        public bool Enabled { get; set; }
        /// <summary>
        /// 最小保留数量。
        /// </summary>
        public int MinValue { get; set; }
        /// <summary>
        /// 最多可拥有数量。
        /// </summary>
        public int MaxValue { get; set; }
        /// <summary>
        /// 默认给与的大小。
        /// </summary>
        public int DefaultValue { get; set; }
        /// <summary>
        /// 当前用户所拥有的数量。
        /// </summary>
        public int Value { get; set; }
        /// <summary>
        /// 唯一键，每个网站ID内唯一，用于编程使用。
        /// </summary>
        public string Key { get; set; }

        /// <summary>
        /// 两个货币相加，两个货币必须属于同一种货币。
        /// </summary>
        /// <param name="c1">货币1。</param>
        /// <param name="c2">货币2。</param>
        /// <returns>返回相加的结果。</returns>
        public static Currency operator +(Currency c1, Currency c2)
        {
            if (c1.CurrencyID != c2.CurrencyID)
                throw new Exception("两个货币不一样，不能相加！");
            return (c1 + c2.Value);
        }
        /// <summary>
        /// 两个货币相加，两个货币必须属于同一种货币。
        /// </summary>
        /// <param name="currency">货币。</param>
        /// <param name="value">货币数量。</param>
        /// <returns>返回相加的结果。</returns>
        public static Currency operator +(Currency currency, int value)
        {
            currency.Value += value;
            if (currency.MaxValue > 0 && currency.Value > currency.MaxValue)
                currency.Value = currency.MaxValue;
            return currency;
        }
        /// <summary>
        /// 两个货币相减，两个货币必须属于同一种货币。
        /// </summary>
        /// <param name="c1">货币1。</param>
        /// <param name="c2">货币2。</param>
        /// <returns>返回相加的结果。</returns>
        public static Currency operator -(Currency c1, Currency c2)
        {
            if (c1.CurrencyID != c2.CurrencyID)
                throw new Exception("两个货币不一样，不能相减！");
            return c1 - c2.Value;
        }
        /// <summary>
        /// 两个货币相减，两个货币必须属于同一种货币。
        /// </summary>
        /// <param name="currency">货币。</param>
        /// <param name="value">货币数量。</param>
        /// <returns>返回相加的结果。</returns>
        public static Currency operator -(Currency currency, int value)
        {
            currency.Value -= value;
            if (currency.Value < currency.MinValue)
                throw new Exception("货币最少需要有：" + currency.GetValue(currency.MinValue)+"，不能减少这么多！");
            return currency;
        }

        private string GetValue(int value) { 
            if (IsMoney)
                return (value / 100.0).ToString("C");
            return value.ToString();
        }

        /// <summary>
        /// 获取当前货币字符串，如果是金钱则除以100后格式化。
        /// </summary>
        /// <returns>格式化或的字符串。</returns>
        public override string ToString()
        {
            return GetValue(Value);
        }
    }
}
